home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_64 / sbdac.c < prev    next >
C/C++ Source or Header  |  1995-01-01  |  2KB  |  109 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include "sb.h"
  4.  
  5. static void far interrupt (*OldIRQ)();
  6. volatile int DMA_complete;
  7.  
  8.  
  9. /* Interrupt handler for DMA complete IRQ from Soundblaster */
  10. static void far interrupt SBHandler()
  11. {
  12.     enable();
  13.     DMA_complete = 1;
  14.  
  15.     /* Acknowledge the interrupt */
  16.     inportb(DSP_DATA_AVAIL);
  17.     outportb(0x20,0x20);
  18. }
  19.  
  20. /* Sets the sample rate to be used for digitising or playback */
  21. void Sb_Sample_Rate(unsigned rate)
  22. {
  23.     unsigned char tc;
  24.  
  25.     tc = (unsigned char)(256 - (1000000/rate));
  26.  
  27.     writedac(TIME_CONSTANT);  /* Command byte for sample rate */
  28.     writedac(tc);    /* Sample rate time constant */
  29. }
  30.  
  31. void Sb_Voice(int state)
  32. {
  33.     writedac((state) ? SPEAKER_ON : SPEAKER_OFF);
  34. }
  35.  
  36. void Sb_OutVoice_DMA(char far *data, unsigned dlen, int stereo)
  37. {
  38.     int t;
  39.     long addr;
  40.     register int i;
  41.     unsigned char im, tm;
  42.  
  43.     DMA_complete = 0;
  44.  
  45.     /* Enable interrupts on PIC */
  46.     im = inportb(0x21);
  47.     tm = ~(1 << SbIRQ);
  48.     outportb(0x21,im & tm);
  49.     enable();
  50.  
  51.     /* Setup DMA */
  52.     dma_reset(SbDMAchan);
  53.     dma_setup(SbDMAchan,data,dlen,1);
  54.  
  55.     /* Turn on stereo output */
  56.     if(stereo && SbType == SBPro)
  57.     writemixer(0x0e,0x13);
  58.  
  59.     /* Setup Soundblaster for transfer */
  60.     writedac(DMA_8_BIT_DAC);
  61.  
  62.     /* Write length */
  63.     writedac(dlen & 0xff);
  64.     writedac(dlen >> 8);
  65. }
  66.  
  67. void Sb_Init_Voice_DMA(void interrupt (*handler)(void))
  68. {
  69.     /* Insert our IRQ handler into interrupt chain */
  70.     disable();
  71.     OldIRQ = getvect(0x08 + SbIRQ);
  72.     if(!handler)
  73.         handler = SBHandler;
  74.  
  75.     setvect(0x08 + SbIRQ,handler);
  76.     enable();
  77. }
  78.  
  79. void Sb_DeInit_Voice_DMA(void)
  80. {
  81.     unsigned char tm;
  82.  
  83.     /* Turn off stereo output */
  84.     if(SbType == SBPro)
  85.     writemixer(0x0e,0x11);
  86.  
  87.     /* Restore old IRQ vector */
  88.     disable();
  89.     setvect(0x08 + SbIRQ,OldIRQ);
  90.     tm = inportb(0x21);
  91.     outportb(0x21,tm | (1 << SbIRQ));
  92.     enable();
  93. }
  94.  
  95. int Sb_DMA_Complete(void)
  96. {
  97.     return DMA_complete;
  98. }
  99.  
  100. void Sb_Halt_DMA(void)
  101. {
  102.     writedac(HALT_DMA);
  103. }
  104.  
  105. void Sb_Continue_DMA(void)
  106. {
  107.     writedac(CONTINUE_DMA);
  108. }
  109.